#ifndef __PID_H
#define __PID_H

#include <float.h>

/* Config */

#define PID_MAX_OUTPUT (FLT_MAX)
#define PID_MIN_OUTPUT (-FLT_MAX)

#define PID_COMPUTE_TYPE float

/* Config */

typedef PID_COMPUTE_TYPE PidCompuateType;

typedef struct
{
	PidCompuateType Kp; // 比例系数 Kp
	PidCompuateType Ki; // 积分系数 Ki = Kp * (T / Ti)
	PidCompuateType Kd; // 微分系数 Kd = Kp * (Td / T)

	// 输出限制
	PidCompuateType minOutput;
	PidCompuateType maxOutput;
} PidConfigType;

typedef struct
{
	// 输出限制
	PidCompuateType minOutput;
	PidCompuateType maxOutput;
	PidCompuateType p0, p1, p2; // error 参数

	PidCompuateType output;		  // 输出值
	PidCompuateType prevError[2]; // 第 k-1, k-2 次偏差
} PidHandler;

void PidConfig(PidHandler *pid, const PidConfigType *cfg);
PidCompuateType PidCompute(PidHandler *pid, PidCompuateType error);
void PidReset(PidHandler *pid);

#endif
